/*
循环队列须要几个參数来确定
  front，tail，length，capacity
  front指向队列的第一个元素，tail指向队列最后一个元素的下一个位置
  length表示当前队列的长度，capacity标示队列最多容纳的元素
*/
type MyCircularQueue struct {
    Head int // 头指针
    Tail int // 尾指针
    length int // 长度
    capactity int //容量
    queues int
}
/**
2.循环队列各个參数的含义
（1）队列初始化时，front和tail值都为零
（2）当队列不为空时，front指向队列的第一个元素，tail指向队列最后一个元素的下一个位置；
（3）当队列为空时，front与tail的值相等，但不一定为零
（4）当（tail+1）% capacity == front ||  （length+1）== capacity 表示队列为满，
    因此循环队列默认浪费1个空间
*/

/** 在此初始化您的数据结构。 将队列的大小设置为k。 */
func Constructor(k int) MyCircularQueue {
    CircularQueue := &MyCircularQueue{
        Head: 0,
        Tail: 0,
		Length: 0,
		Capacity: k,
		Queues: make([]interface{}, 0,1000)
	}
	for i := 0; i < 1000; i++ {
		CircularQueue.Queues = append(CircularQueue.Queues, "")
	}
	return CircularQueue
}

/*
3.循环队列算法实现
（1）把值存在tail所在的位置；
（2）每插入1个元素，length+1，tail=（tail+1）% capacity
（3）每取出1个元素，length-1，front=（front+1）% capacity
（4）扩容功能，当队列容量满，即length+1==capacity时，capacity扩大为原来的2倍
（5）缩容功能，当队列长度小于容量的1/4，即length<=capacity/4时，capacity缩短为原来的一半
*/
/** 将元素插入循环队列。 如果操作成功，则返回true。 */
func (this *MyCircularQueue) EnQueue(value int) bool {
	this.queues = value
	this.Head 
}


/** 从循环队列中删除一个元素。 如果操作成功，则返回true。*/
func (this *MyCircularQueue) DeQueue() bool {

}


/** 从队列中获取最前面的项目。*/
func (this *MyCircularQueue) Front() int {
	return this[&this.Head]
}


/** 从队列中获取最后一个项目。 */
func (this *MyCircularQueue) Rear() int {

}


/** 检查循环队列是否为空。 */
func (this *MyCircularQueue) IsEmpty() bool {
	return this.Head == this.Tail && this.length == 0
}


/**检查循环队列是否已满。 */
func (this *MyCircularQueue) IsFull() bool {
	return this.Taile == this.Head && this.length == this.capactity
}


/**
 * 您的MyCircularQueue对象将被实例化并这样调用：
 * obj := Constructor(k);
 * param_1 := obj.EnQueue(value);
 * param_2 := obj.DeQueue();
 * param_3 := obj.Front();
 * param_4 := obj.Rear();
 * param_5 := obj.IsEmpty();
 * param_6 := obj.IsFull();
 */